Julia

¿Por qué? y ¿cómo?

David Gómez-Castro

Universidad Autónoma de Madrid - ICMAT

March 1, 2025

¿Por qué julia?

¿Por qué Julia?

Artículo why we created Julia

  • Es código abierto:

    todo está alojado en GitHub

  • Es reproducible:

    permite controlar todas las versiones de todos los paquetes

  • Es dinámica:

    utiliza tipos dinámicos, y la sintaxis es muy sencilla.

  • Es componible:

    multiple distach

Julia es rápido (JIT)

Eje vertical (tiempo del lenguaje) / (tiempo de ejecución en C)

https://julialang.org/benchmarks/

Comparación con MATLAB

La sintaxis para vectores y matrices veremos que es muy sencilla.

A = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
 1  2  3
 4  5  6
@show A[1, :];
A[1, :] = [1, 2, 3]
Comparación de sintaxis vectorial
Función Julia MATLAB
Leer vector x[i] x(i)
Leer fila de matriz A[i,:] A(i,:)
Resolver sistema lineal A\b A\b
Funciones f(x)=x^2 f = @(x) x^2

Instalación

curl -fsSL https://install.julialang.org | sh

Documentación

Primera ejecución

Al lanzar julia por primera vez veremos algo así:

Uso básico

Variables

x = 2
2

Vectores

x = [1, 2]
2-element Vector{Int64}:
 1
 2

Matrices

A = [1 2]
B = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

Lógica

if x == 1
    println("x es uno. Está solito.")
elseif x == 2
    println("x es dos. Mejor en pareja.")
else
    println("x es $x. ¡Qué decir!")
end
x es [1, 2]. ¡Qué decir!

Bucles básicos

for i = 1:2
    println(i^2)
end
1
4

Scripts

Los scripts de Julia son archivos .jl

a = 1
a = a + 1
println("a=$a")

Ejecutamos en terminal de Unix (si julia está bien en el path)

$ julia MiCodigo.jl
"a=2"

O desde dentro de julia

julia> include("MiCodigo.jl")
"a=2"

IDEs

Visual Studio Code

Para desarrollar código podemos usar Visual Studio Code con Julia.

Jupyter

También podemos utilizar libretas Jupyter

Es una interfaz web basada en libretas para facilitar el uso de Julia, creada originalmente para Python.

Paquetes

¿Qué son?

Las funcionalidades avanzadas se cargan con paquetes (Plots, …)

Los paquetes están alojados en GitHub, donde suelen contar con amplia documentación: ejemplo Plots.jl

Para usar un paquete debemos cargarlo, por ejemplo,

using Plots

Los paquetes deben añadidos en el entorno actual. Para añadirlos basta utilizamos el paquete Pkg.jl de la siguiente forma

using Pkg;
Pkg.add("Plots");
using Plots
plot(x -> exp(x))

x = 1:5
y = exp.(x)

using Plots
plot(x, y)

La magia de los macros

@gif for n = 1:20
    plot(x -> sin(n * x))
end

La magia del código genérico

Para resolver una EDO podemos usar sintaxis similar a ode45

g = 9.79 # Gravitational constant
L = 1.00 # Length of pendulum

u₀ = [0, π / 60] # Initial speed and angle
tspan = (0.0, 6.3) # Time span

# Define the problem
function pendulum(du, u, p, t)
    θ = u[1]
= u[2]
    du[1] =
    du[2] = -(g / L) * θ
end

# Pass to solver
using DifferentialEquations
prob = ODEProblem(pendulum, u₀, tspan)
sol = solve(prob, Tsit5(), reltol=1e-6)

# Plot
using Plots
plot(sol.t, first.(sol.u), label="\\theta")

*Tomado de The Unreasonable Effectiveness of Multiple Dispatch

Sin modificar la librería DifferentialEquations podemos extenderla a otros “tipos de datos”

using Measurements
g = 9.79 ± 0.02 # Gravitational constant
L = 1.00 ± 0.01 # Length of pendulum

u₀ = [0 ± 0.0, π / 60 ± 0.01] # Initial speed and angle
tspan = (0.0, 6.3) # Time span

# Define the problem
function pendulum(du, u, p, t)
    θ = u[1]
= u[2]
    du[1] =
    du[2] = -(g / L) * θ
end

# Pass to solver
using DifferentialEquations
prob = ODEProblem(pendulum, u₀, tspan)
sol = solve(prob, Tsit5(), reltol=1e-6)

# Plot
using Plots
plot(sol.t, first.(sol.u), label="\\theta")

*Tomado de The Unreasonable Effectiveness of Multiple Dispatch